'use strict';

/**
 * 玩家实体类
 */
class Player {
  /**
   * 构造函数
   * @param {string} id 玩家ID
   * @param {object} socket Socket连接对象
   */
  constructor(id, socket) {
    this.id = id;
    this.socket = socket;
    this.isLoggedIn = false;
    this.loginTime = null;
    this.lastActiveTime = Date.now();
    this.sessionId = null;
  }

  /**
   * 验证登录信息
   * @param {object} loginData 登录数据
   * @returns {Promise<boolean>} 登录是否成功
   */
  async validateLogin(loginData) {
    try {
      // 验证必要字段
      if (!loginData || !loginData.nickName || !loginData.password) {
        throw new Error('缺少登录信息');
      }

      // TODO: 这里应该调用数据库或其他服务验证用户名和密码
      // 示例中使用模拟验证
      const isValid = await this._mockValidateCredentials(loginData.nickName, loginData.password);

      if (isValid) {
        this.isLoggedIn = true;
        this.loginTime = Date.now();
        this.sessionId = this._generateSessionId();
        this.nickName = loginData.nickName;
        return true;
      }

      return false;
    } catch (error) {
      console.error('[Player] 登录验证失败:', error);
      return false;
    }
  }

  /**
   * 模拟验证凭证
   * @param {string} nickName 用户名
   * @param {string} password 密码
   * @returns {Promise<boolean>} 验证是否通过
   * @private
   */
  async _mockValidateCredentials(nickName, password) {
    // TODO: 这里应该替换为真实的验证逻辑
    // 示例中，用户名以"test"开头且密码长度大于6即视为有效
    return nickName.startsWith('test') && password.length >= 6;
  }

  /**
   * 生成会话ID
   * @returns {string} 会话ID
   * @private
   */
  _generateSessionId() {
    return `${this.id}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
  }

  /**
   * 更新最后活动时间
   */
  updateLastActiveTime() {
    this.lastActiveTime = Date.now();
  }

  /**
   * 获取玩家基本信息
   * @returns {object} 玩家信息
   */
  getBasicInfo() {
    return {
      id: this.id,
      nickName: this.nickName,
      isLoggedIn: this.isLoggedIn,
      loginTime: this.loginTime,
      lastActiveTime: this.lastActiveTime
    };
  }

  /**
   * 发送消息给玩家
   * @param {string} event 事件名称
   * @param {object} data 消息数据
   */
  send(event, data) {
    if (this.socket && this.socket.connected) {
      this.socket.emit(event, data);
    }
  }

  /**
   * 断开玩家连接
   * @param {string} reason 断开原因
   */
  disconnect(reason = 'normal') {
    if (this.socket && this.socket.connected) {
      this.socket.disconnect(true);
    }
    this.isLoggedIn = false;
    this.loginTime = null;
    this.sessionId = null;
  }
}

module.exports = Player;
